﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.SharePoint.Client;


namespace Microsoft.ProductivityHub.SilverlightBookshelf
{
	public partial class App : Application
	{
        internal static List<string> SupportedIconNames = (new string[] { 
            "DOC", "DOCX", "WMV", "PPT", "HTM", "PPTX", "XLS", "XLSX", "MHT", "MHTML", "MPP", "ONE", "PPS", 
            "PPTM", "PUB", "TXT", "VSD", "WM", "WMA", "WMD", "WMP", "WMS", "WMX", "WMZ", "XPS", "ZIP"
        }).ToList();

		public App()
		{
			this.Startup += this.Application_Startup;
			this.Exit += this.Application_Exit;
			this.UnhandledException += this.Application_UnhandledException;

			InitializeComponent();

		}

        private bool ParseColorStr(string colorStr, out Color matchedColor)
        {
            matchedColor = Colors.White;

            if (!String.IsNullOrEmpty(colorStr))
            {
                try
                {
                    colorStr = colorStr.Trim();
                    if (colorStr.StartsWith("#"))
                    {
                        colorStr = colorStr.Substring(1);
                    }
                    if (colorStr.Length != 6)
                    {
                        return false;
                    }
                    byte a = System.Convert.ToByte("FF", 16);
                    byte r = System.Convert.ToByte(colorStr.Substring(0, 2), 16);
                    byte g = System.Convert.ToByte(colorStr.Substring(2, 2), 16);
                    byte b = System.Convert.ToByte(colorStr.Substring(4, 2), 16);
                    matchedColor = Color.FromArgb(a, r, g, b);
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
            else
            {
                return false;
            }

        }

		private void Application_Startup(object sender, StartupEventArgs e)
		{
            string lightColorStr = null;
            string darkColorStr = null;

            // Get the color params if available
            if (e.InitParams.ContainsKey("lightcolor"))
            {
                lightColorStr = e.InitParams["lightcolor"];
                Color lightColor;
                if (ParseColorStr(lightColorStr, out lightColor))
                {
                    BindableValues.ButtonBackLightColor = lightColor;
                }
            }

            if (e.InitParams.ContainsKey("darkcolor"))
            {
                darkColorStr = e.InitParams["darkcolor"];
                Color darkColor;
                if (ParseColorStr(darkColorStr, out darkColor))
                {
                    BindableValues.ButtonBackDarkColor = darkColor;
                }
            }

            // setup application context
            ApplicationContext.Init(e.InitParams, System.Threading.SynchronizationContext.Current);
			this.RootVisual = new MainPage();
		}

		private void Application_Exit(object sender, EventArgs e)
		{
		}

		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
		{
			// If the app is running outside of the debugger then report the exception using
			// the browser's exception mechanism. On IE this will display it a yellow alert 
			// icon in the status bar and Firefox will display a script error.
			if (!System.Diagnostics.Debugger.IsAttached)
			{

				// NOTE: This will allow the application to continue running after an exception has been thrown
				// but not handled. 
				// For production applications this error handling should be replaced with something that will 
				// report the error to the website and stop the application.
				e.Handled = true;
				Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
			}
		}

		private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
		{
			try
			{
				string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
				errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

				System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
			}
			catch (Exception)
			{
			}
		}
	}
}